package xyz.lwm.lazycat.web.handle;

import java.io.InputStream;
import java.net.HttpCookie;
import java.net.URI;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * http request
 *
 * @author lwm
 */
public interface HttpRequest {

    /**
     * @return 请求方法
     */
    String getMethod();

    /**
     * @return 请求uri
     */
    URI getURI();

    /**
     * @return 请求路径
     */
    String getPath();

    /**
     * @return 请求参数
     */
    String getQuery();

    /**
     * @return 请求头
     */
    Map<String, List<String>> getHeaders();

    /**
     *
     * @param headerKey 请求头key
     * @return 请求头
     */
    String getHeader(String headerKey);

    /**
     * @param headerKey 请求头key
     * @return 请求头
     */
    String getHeader(Header headerKey);

    /**
     * @param headerKey 请求头key
     * @param charset   字符集
     * @return 请求头
     */
    String getHeader(String headerKey, Charset charset);

    /**
     * @return 请求头
     */
    String getContentType();

    /**
     * @return 字符集
     */
    Charset getCharset();

    /**
     * @return user agent
     */
    String getUserAgent();

    /**
     * @return cookies
     */
    String getCookiesString();

    /**
     * @return cookies
     */
    Collection<HttpCookie> getCookies();

    /**
     * @return cookies
     */
    Map<String, HttpCookie> getCookieMap();

    /**
     * @param cookieName cookie name
     * @return cookie
     */
    HttpCookie getCookie(String cookieName);

    /**
     * @return 是否是 multipart
     */
    boolean isMultipart();

    /**
     * @return 是否是 form urlencoded
     */
    boolean isForUrlencoded();

    /**
     * @return 是否是 application/json
     */
    boolean isApplicationJson();

    /**
     * @return 是否是 text/plain
     */
    boolean isTextPlain();

    /**
     * @return 请求体
     */
    String getBody();

    /**
     * @param charset 字符集
     * @return 请求体
     */
    String getBody(Charset charset);

    /**
     * @return 请求体
     */
    byte[] getBodyBytes();

    /**
     * @return 请求体
     */
    InputStream getBodyStream();

    /**
     * @param name 参数名
     * @return 参数值
     */
    String getParam(String name);

    /**
     * @param name 参数名
     * @return 参数值
     */
    List<String> getParams(String name);

    /**
     * @return 参数
     */
    Map<String, List<String>> getParams();

    /**
     * 如: /user/{id}   /user/123   -> id = 123
     *
     * @param name 路径参数名
     * @return 路径参数值
     */
    String getPathParam(String name);

    /**
     * @return 路径参数 map
     */
    Map<String, String> getPathParams();

    /**
     * @return multipart
     */
    Multipart getMultipart();

}
